使用Perl替换正则表达式 |
您所在的位置:网站首页 › trans用法 lisp › 使用Perl替换正则表达式 |
我正在尝试使用perl替换正则表达式。我在perl中使用了sed,但是它似乎不起作用。 要在文件trans.xml中替换的示例行 "公平"和"效率" 我需要将"效率"替换为"效率" 我尝试了以下代码, 12system"sed -e 's/\\&\\#x0027\\;\\([a-zA-Z0-9 _]*\\)\\&\\#x2019\\;/tooch&/g' trans.xml > tmp.xml"; system"sed -e 's/tooch\\&\\#x0027\\;/\\&\\#x2018\\;/g' tmp.xml > trans.xml"上面的sed命令可以手动运行,但不能在Perl内部运行。 任何帮助将不胜感激!! 相关讨论 为什么在Perl中调用sed?您是双引号的受害者。 将system呼叫替换为say将使您更清楚地了解发生了什么: 12sed -e 's/ ([a-zA-Z0-9 _]*) /tooch&/g' trans.xml > tmp.xml sed -e 's/tooch / /g' tmp.xml > trans.xml看看怎么了?没有反斜杠了。它们已经由Perl双引号解释,并且sed不能使用它们。 您的大小写要纠正起来有些棘手,因为您已经使用(并且需要)将单引号传递给sed。从理论上讲,您可以再逃脱一次所需的时间,但这容易出错。最好使用Perl的其他单引号功能: 12system q+sed -e 's/\\&\\#x0027\\;\\([a-zA-Z0-9 _]*\\)\\&\\#x2019\\;/tooch&/g' trans.xml > tmp.xml+; system q(sed -e 's/tooch\\&\\#x0027\\;/\\&\\#x2018\\;/g' tmp.xml > trans.xml);我在第一行使用+作为分隔符,因为它恰好不在字符串本身中使用。我在第二行中使用普通括号,因为它们在那里100%清晰。 一些严重的问题: 为什么要呼叫sed?当然,在perl中可能很难执行IO,但是perl具有regexp的内置功能。 12345use Path::Tiny qw(path); my $content = path('trans.xml')->slurp; $content =~ s/bar/baz/g; $content =~ s/foo/bar/g; path('trans.xml')->spew( $content );注意:如果trans.xml是UTF-8编码的,那么您要做的就是将slurp / spew替换为slurp_utf8 / spew_utf8。 VS sed,可能不了解unicode。 system尽可能避免使用字符串,由于多种原因,一个是您遇到的问题:报价很困难。 1system('sed', '-e', $regexp )在可能的情况下是首选语法。请注意,您不能将其与重定向一起使用,但实际上并不需要。 不需要多次调用sed: 1sed 's/foo/bar/g;s/bar/baz/g'这将同时应用两个表达式。 一旦实现了#3,就不需要临时文件: 1sed -i 's/foo/bar/g;s/bar/baz/g' $file这将修改$file INPLACE 使用system时,可能要检查返回值。 相关讨论 谢谢。我避免使用sed并使用perl替代,它更快! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |